package com.yesido.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yesido
 * @description
 * @date 2023-06-24 21:06
 * @Version 8.3
 */
@Aspect
@Component
public class MyInterfaceAspect {
    // 用于存储幂等性检查的结果，key为方法签名，value为幂等性结果
    private Map<String, Boolean> idempotentCache = new HashMap<>();

    //@Before("@annotation(com.yesido.spring.aop.Idempotent)")
    public void checkIdempotent(JoinPoint joinPoint) throws Exception {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        // 获取幂等性注解信息
        Idempotent annotation = method.getAnnotation(Idempotent.class);
        String key = annotation.value();
        // 构造方法签名
        String methodSignature = method.toGenericString();

        // 检查幂等性缓存
        if (idempotentCache.containsKey(methodSignature)) {
            boolean isIdempotent = idempotentCache.get(methodSignature);
            if (!isIdempotent) {
                throw new RuntimeException("Duplicate request detected!");
            }
        } else {
            // 模拟幂等性检查，这里可以根据实际需求进行具体的幂等性判断
            boolean isIdempotent = checkIdempotentLogic(key);
            idempotentCache.put(methodSignature, isIdempotent);
            if (!isIdempotent) {
                throw new RuntimeException("Duplicate request detected!");
            }
        }
    }

    private boolean checkIdempotentLogic(String key) {
        // 实现具体的幂等性判断逻辑，例如检查缓存、数据库等
        // 返回 true 表示是幂等的，返回 false 表示非幂等
        // 这里仅作示例，具体的实现需要根据业务需求来确定
        return true;
    }
}
